import axios, { AxiosError, AxiosResponse, InternalAxiosRequestConfig,AxiosRequestConfig } from 'axios';
import { ElMessage } from 'element-plus';
import { getMessageInfo } from './status';
interface BaseResponse<T = any>{
    code:number|string;
    message:string;
    data:T;
    status?:number|string;
}
const service=axios.create({
    // 启用 mock 就请求 mock 路径
    // 不启用 mock 就请求 正常后端路径
    baseURL: Boolean(import.meta.env.VITE_APP_USE_MOCK)
    ? import.meta.env.VITE_APP_MOCK_BASEURL
    : import.meta.env.VITE_APP_API_BASEURL,
    timeout:15000
});
//axios实例拦截请求
service.interceptors.request.use(
    (config:InternalAxiosRequestConfig)=>{
        return config;
    },
    (error:AxiosError)=>{
    return Promise.reject(error);
    }
)
// axios实例拦截响应
service.interceptors.response.use((response:AxiosResponse)=>{
    if(response.status==200){
        return response.data;
    }
    ElMessage({
        message:getMessageInfo(response.status),
        type:'error'
    })
    return response.data;
},(error:any)=>{
    const {response}=error;
    if(response){
        ElMessage({
            message:getMessageInfo(response.status),
            type:'error'
        })
        return Promise.reject(response.data);
    }
    ElMessage({
        message:'网络连接异常,请稍后再试',
        type:'error'
    })
})
// 二次响应拦截
const requestInstance = <T = any>(config:AxiosRequestConfig):Promise<T> => {
    const conf=config;
    return new Promise((resolve,reject)=>{
        service.request<any,AxiosResponse<BaseResponse>>(conf).then((res:AxiosResponse<BaseResponse>)=>{
            const data=res.data; //如果data.code为错误代码返回message信息
            if(data.code!=0){
                ElMessage({
                    message:data.message,
                    type:'error'
                })
                reject(data.message);
            }else{
                ElMessage({
                    message:data.message,
                    type:'success'
                });//返回data信息 也就是api中配置好的Response类型
                resolve(data.data as T);
            }
        })
    })
}
// 自定义封装get
export function get<T = any,U = any>(config:AxiosRequestConfig,url:string,parms?:U):Promise<T>{
    return requestInstance({...config,url,method:'GET',params:parms});
}
// 自定义封装post
export function post<T = any,U = any>(
    config:AxiosRequestConfig,
    url:string,
    data?:U
):Promise<T>{
    return requestInstance({...config,url,method:'POST',data:data});
}
// 自定义封装put
export function put<T = any,U = any>(
    config:AxiosRequestConfig,
    url:string,
    parms?:U
):Promise<T>{
    return requestInstance({...config,url,method:'PUT',params:parms});
}
// 自定义封装delete
export function del<T = any,U = any>(
    config:AxiosRequestConfig,
    url:string,
    data?:U
):Promise<T>{
    return requestInstance({...config,url,method:'DELETE',data:data});
}




// export default service;
// npm install -D vite @vitejs/plugin-vue @vitejs/plugin-vue-jsx
                        // 使代码可以编译vue的插件    使代码可以编辑jsx的文件
// npm install -D @types/node @types/nprogress vue-tsc
                    // 让代码可以使用ts   进度条加载
// 安装完成后我们需要考虑环境变量
// vite是一个在特殊的import.meta.env对象上暴露的环境变量